package org.example.backend.util;

import org.example.backend.dto.Result;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

import java.util.HashMap;
import java.util.Map;

/**
 * 响应工具类
 * 用于生成标准化的HTTP响应，包含状态码和JSON格式数据
 */
public class ResponseUtil {

    /**
     * 成功响应（200 OK）
     * @param <T> 数据类型
     * @return ResponseEntity对象
     */
    public static <T> ResponseEntity<Result<T>> success() {
        return success(null);
    }

    /**
     * 成功响应（200 OK）
     * @param data 响应数据
     * @param <T> 数据类型
     * @return ResponseEntity对象
     */
    public static <T> ResponseEntity<Result<T>> success(T data) {
        Result<T> result = Result.success(data);
        return ResponseEntity.ok(result);
    }

    /**
     * 创建成功响应（201 Created）
     * @param <T> 数据类型
     * @return ResponseEntity对象
     */
    public static <T> ResponseEntity<Result<T>> created() {
        return created(null);
    }

    /**
     * 创建成功响应（201 Created）
     * @param data 响应数据
     * @param <T> 数据类型
     * @return ResponseEntity对象
     */
    public static <T> ResponseEntity<Result<T>> created(T data) {
        Result<T> result = Result.success(data);
        return ResponseEntity.status(HttpStatus.CREATED).body(result);
    }

    /**
     * 错误响应
     * @param httpStatus HTTP状态码
     * @param message 错误信息
     * @param <T> 数据类型
     * @return ResponseEntity对象
     */
    public static <T> ResponseEntity<Result<T>> error(HttpStatus httpStatus, String message) {
        Result<T> result = Result.error(httpStatus.value(), message);
        return ResponseEntity.status(httpStatus).body(result);
    }

    /**
     * 错误响应（400 Bad Request）
     * @param message 错误信息
     * @param <T> 数据类型
     * @return ResponseEntity对象
     */
    public static <T> ResponseEntity<Result<T>> badRequest(String message) {
        return error(HttpStatus.BAD_REQUEST, message);
    }

    /**
     * 错误响应（401 Unauthorized）
     * @param message 错误信息
     * @param <T> 数据类型
     * @return ResponseEntity对象
     */
    public static <T> ResponseEntity<Result<T>> unauthorized(String message) {
        return error(HttpStatus.UNAUTHORIZED, message);
    }

    /**
     * 错误响应（403 Forbidden）
     * @param message 错误信息
     * @param <T> 数据类型
     * @return ResponseEntity对象
     */
    public static <T> ResponseEntity<Result<T>> forbidden(String message) {
        return error(HttpStatus.FORBIDDEN, message);
    }

    /**
     * 错误响应（404 Not Found）
     * @param message 错误信息
     * @param <T> 数据类型
     * @return ResponseEntity对象
     */
    public static <T> ResponseEntity<Result<T>> notFound(String message) {
        return error(HttpStatus.NOT_FOUND, message);
    }

    /**
     * 错误响应（500 Internal Server Error）
     * @param message 错误信息
     * @param <T> 数据类型
     * @return ResponseEntity对象
     */
    public static <T> ResponseEntity<Result<T>> serverError(String message) {
        return error(HttpStatus.INTERNAL_SERVER_ERROR, message);
    }

    /**
     * 创建包含额外信息的响应
     * @param data 主要数据
     * @param extraInfo 额外信息
     * @param <T> 数据类型
     * @return 包含额外信息的Map
     */
    public static <T> Map<String, Object> withExtraInfo(T data, Map<String, Object> extraInfo) {
        Map<String, Object> result = new HashMap<>();
        result.put("data", data);
        result.putAll(extraInfo);
        return result;
    }

    /**
     * 创建包含分页信息的响应
     * @param data 数据列表
     * @param total 总记录数
     * @param current 当前页码
     * @param size 每页大小
     * @param <T> 数据类型
     * @return 包含分页信息的Map
     */
    public static <T> Map<String, Object> withPagination(T data, long total, int current, int size) {
        Map<String, Object> result = new HashMap<>();
        result.put("records", data);
        result.put("total", total);
        result.put("current", current);
        result.put("size", size);
        result.put("pages", (total + size - 1) / size);
        return result;
    }
} 